import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_module/bloc/event/second_event.dart';
import 'package:flutter_module/bloc/state/second_state.dart';
import 'package:flutter_module/model/article.dart';
import 'package:flutter_module/model/article_tags.dart';
import 'package:flutter_module/model/page_data.dart';

import 'repository/second_page_respsitory.dart';

///格式： class 自定义Bloc 继承Bloc<泛型1，泛型2>
///泛型1：表示事件类型，在单独的类中定义事件
///泛型2：表示状态类型，在单独的类中定义状态
///on<泛型3>(方法)
///泛型3
///方法：需要执行的逻辑，内部要结合emit使用
///emit:发送事件
class SecondBloc extends Bloc<PostEvent, SecondState> {
  // int page = 0;
  // bool canLoadMore = true;

  SecondPageRepository secondPageRepository;

  SecondBloc({required this.secondPageRepository})
      : super(const SecondState()) {
    //监听事件的分发
    on<RefreshEvent>(_pageOnFresh);
    on<LoadMoreEvent>(_pageLoadMore);
  }

  //参数1和参数2，固定写法
  Future<void> _pageOnFresh(
      RefreshEvent event, Emitter<SecondState> emit) async {
    secondPageRepository.page = 0;
    emit(state.copyWith(status: PostStatus.initial));

    await Future.delayed(const Duration(seconds: 1)); //网络较慢的情况下，才增加

    await _handleData(emit);
  }

  Future<void> _pageLoadMore(
      LoadMoreEvent event, Emitter<SecondState> emit) async {
    //逻辑处理
    if (!state.canLoadMore) return;
    await _handleData(emit);
  }

  Future<void> _handleData(Emitter<SecondState> emit) async {
    await secondPageRepository.getArticleList(
        (PageData<Article<ArticleTags>>? pageData) {
      emit(
        state.copyWith(
            status: PostStatus.success,
            datas: [...state.datas, ...?pageData?.datas],
            canLoadMore: secondPageRepository.canLoadMore),
      );
    }, (String? errorMessage) {
      emit(state.copyWith(status: PostStatus.failure));
    });
  }

// Future<List<Article<ArticleTags>>?> _getArticleList(
//   Function(PageData<Article<ArticleTags>>?)? onResponse,
//   Function(String?)? onFailed,
// ) async {
//   PageData<Article<ArticleTags>>? pageData = await requestClient.get<
//           PageData<Article<ArticleTags>>>("/article/list/$page/json",
//       fromJsonT: (json) => PageData.fromJson(
//           json,
//           (json) =>
//               Article.fromJson(json, (json) => ArticleTags.fromJson(json))),
//       onResponse: (ApiResponse<PageData<Article<ArticleTags>>?> response) {
//         onResponse?.call(response.data);
//       },
//       onError: (e) {
//         onFailed?.call(e.message);
//       });
//   page++;
//   if (page >= pageData!.pageCount) {
//     canLoadMore = false;
//   }
//   return pageData.datas;
// }
}
